﻿using Levfier.Proccessors.Chains;
using Levfier.Proccessors.Parameters;
using System.Collections.Generic;

namespace Levfier.Proccessors
{
    public interface IProccessable
    {
        /// <summary>
        /// 音を処理し、後段のバッファに流す
        /// </summary>
        /// <param name="input">音の時系列データ</param>
        void Proccess(double[] input);

        /// <summary>
        /// 後段のバッファを設定する
        /// </summary>
        /// <param name="stream">バッファ</param>
        void SetLowerChain(IChainable stream);

        /// <summary>
        /// 設定済みの後段バッファを削除する
        /// </summary>
        void RemoveLowerChain();

        /// <summary>
        /// 上流チェインが接続したことをプロセッサに通知する
        /// 上流チェインから呼び出す
        /// </summary>
        void NotifyConnect(IChainable chain);

        /// <summary>
        /// 上流チェインが切断したことをプロセッサに通知する
        /// 上流チェインから呼び出す
        /// </summary>
        void NotifyDisconnect(IChainable chain);

        /// <summary>
        /// パラメータのコレクションを取得する
        /// </summary>
        /// <returns>パラメータのコレクション</returns>
        IDictionary<string, ProccessParameter> GetParameters();
    }
}
